package com.nf.teamwork.mall.config;

import io.swagger.annotations.Api;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

/**
 * @Author: LJP
 * @Classname SwaggerConfig
 * @Date: 2020-02-25 16:44
 * @Description: swagger配置类
 * 导入swagger相关jar包，在配置类修饰上@EnableSwagger2注解，即可与spring boot项目完成集成
 */
@Configuration
@EnableSwagger2
public class SwaggerConfig {
    /**
     * 如下操作就是替换Swagger的默认配置信息
     * 配置了Swagger的Docket的bean实例（可根据开发人员进行‘分组’配置）
     * @return
     */
    @Bean
    public Docket SmallRubbishDocket(Environment environment){
        //设置要生成Swagger API文档的环境(如下判断是否处于dev生产环境下)
        Profiles profiles = Profiles.of("dev");
        //通过environment.acceptsProfiles判断是否处于自己设定的生产环境中
        boolean flag = environment.acceptsProfiles(profiles);

//        如要使用生产环境请把下面这行代码注释
        flag = true;


        /**
         * DocumentationType类中定义字段
         * public static final DocumentationType SWAGGER_12 = new DocumentationType("swagger", "1.2");
         * public static final DocumentationType SWAGGER_2 = new DocumentationType("swagger", "2.0");
         * public static final DocumentationType SPRING_WEB = new DocumentationType("spring-web", "1.0");
         *
         * 通过Docket类的构造函数来选择我们使用SWAGGER的版本
         */

        /**
         * apiInfo()：（需要一个ApiInfo对象来进行Api接口的描述配置）
         * groupName()：设置API文档的分组
         *              （搜索框上显示的分组信息，因为在以后的大型项目中会涉及到多人开发SwaggerAPI文档
         *                  所以可以设置分组来更直观的显示哪部分是属于谁管理的【每个人都可以设置自己的分租】）
         * enable()：是否启用Swagger(默认为true)
         * apis：（指定扫描范围中符合条件的类、方法）生成Api文档
         * RequestHandlerSelectors:配置扫描接口的方式：
         *                                  any()：扫描全部
         *                                  none()：都不扫描
         *                                  withClassAnnotation()：扫描被指定注解修饰的类
         *                                  withMethodAnnotation()：扫描被指定注解修饰的方法
         *                                  basePackage()：表指定要扫描的包
         * paths()：过滤器（如下配置扫描controller包下的资源，可以通过paths()再次对扫描到的资源进行过滤）
         *          主要靠PathSelectors对象的方法来指定过滤规则：
         *                                              regex()：正则表达式
         *                                              any()：全部都行
         *                                              none()：全部都不行
         *                                              ant()：指定路径下的才行
         */
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(SmallRubbishApiInfo())
                .groupName("SmallRubbish")
                .enable(flag)
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.nf.teamwork.mall"))
                .paths(PathSelectors.any())
                .build();
    }

    /**
     * Api接口描述配置
     */
    private ApiInfo SmallRubbishApiInfo() {
        /**
         * 创建Contact类，用来存放Api文档作者的相关信息
         * name(第一个参数)：Api文档作者名字
         * url(第二个参数)：Api文档作者blog地址等相关链接(提供一条相关链接)
         * email(第三个参数)：Api文档作者邮箱
         */
        Contact contact = new Contact("SmallRubbish", "https://blog.csdn.net/qq_45026311", "1530937232@qq.com");

        /**
         * Api接口相关配置
         * title：文档标题
         * description：文档描述
         * termsOfServiceUrl：可以写自己的blog地址
         * contact：Api文档作者的相关信息
         * version：Api版本信息
         */
        return new ApiInfoBuilder()
                .title("团队项目接口文档")
                .description("团队项目接口文档的描述")
                .termsOfServiceUrl("https://blog.csdn.net/qq_45026311")
                .contact(contact)
                .version("v1.0")
                .build();
    }
}
